package com.cskaoyan.javase.array._5vp;

/**
 * 可变参数(variable _1parameter)
 * 可变参数的用途不算非常多，但也是常见语法。
 * 可变参数适用于：参数个数不确定，但是类型确定的情况,使用可变参数作为方法的形参时
 *      允许在调用方法时,传入不确定个数的对应数据类型的实际参数.
 *
 * 可变参数的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *   //方法体
 * }
 * 其中"数据类型..."就表示对应数据类型的可变参数
 * 可变参数写在形参里,和对应数据类型的数组是一模一样的,完全一个效果
 * 在方法当中,也完全可以把可变参数当成数组来处理
 *
 * 扩展原理:
 *      可变参数仍然是一个数组
 *      但是和直接将数组作为形参不同
 *      可变参数的数组不是程序员直接创建的
 *      而是编译器在编译代码时,自动将实参中不确定个数的参数转换成对应的数组
 *      像这种实现的原理不变,但是程序员可以少做事,底层封装了一些操作的语法
 *      我们称之为"语法糖"
 *      语法糖的出现就简化了程序员的工作
 *      随着Java版本的升级,语法糖越来越多.
 *
 *
 * @since 10:09
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        // 可变参数就是对应类型的数组,所以调用方法时直接传入数组是允许的,当然既然用了可变参数,建议不要用这种方式调用方法
        System.out.println(sum(arr));

        System.out.println("-------------------");
        // 更常见的可变参数方法调用
        System.out.println(sum(1, 2));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(1, 2, 3, 4));
        System.out.println(sum(1, 2, 3, 4, 5));

    }


    // 需求: 求不确定个数的int数值之和
    // 不确定个数的int数据,需要一个容器来存放,所以方法的形参是一个int数组
    // 'sum(int[])' is already defined in 'com.cskaoyan.javase.array._5vp.Demo'
    /*public statics int sum(int[] arr) {
        // 求数组中所有元素之和
        int result = 0;
        for (int ele : arr) {
            result += ele;
        }
        return result;
    }*/

    // 需求: 求不确定个数的int数值之和,但是希望在调用方法时可以灵活自由的输入不确定个数的int参数
    public static int sum(int... var) {
        int result = 0;
        for (int ele : var) {
            result += ele;
        }
        return result;
    }
}
